home *** CD-ROM | disk | FTP | other *** search
/ By Popular Request 2.0 / By Popular Request 2.0 (Arsenal Computer).ISO / amiga_6 / tiffdtyp.lha / sources / c2p.asm next >
Assembly Source File  |  1995-06-25  |  4KB  |  226 lines

  1.     opt    l+    ;Linkable code
  2.     opt    c+    ;Case sensitive
  3.     opt    d-    ;No debugging information
  4.     opt    m+    ;Expand macros in listing
  5.     opt    o-    ;No optimisation
  6.  
  7. ; Chunky2Planar algorithm.
  8. ;
  9. ;     Cpu only solution
  10. ;    Optimised for 020+fastram
  11. ;    Aim for less than 90ms for 320x200x256 on 14MHz 020
  12.  
  13.     
  14.     xdef    _Chunky2Planar
  15.         
  16. ;  a0 -> chunky pixels
  17. ;  a1 -> plane0
  18. ;  d0 -> width
  19.  
  20.  
  21. wordmerge    macro
  22.     ; i1    i2    tmp
  23.     ; \1    \2    \3
  24. ;; speedup            \1 AB \2 CD
  25.     move.l    \2,\3        \3 = CD
  26.     move.w    \1,\2        \2 = CB
  27.     swap    \2        \2 = BC
  28.     move.w    \2,\1        \1 = AC
  29.     move.w    \3,\2        \2 = BD
  30.     endm
  31.  
  32.         
  33. merge1    macro    ;    i1    i2    t3    t4    m    s
  34.         ;    \1    \2    \3    \4    \5    \6
  35.         ;    output as \1,\3
  36.             ; \1 = abqr
  37.             ; \2 = ijyz
  38.     move.l    \5,\3    ; \3 = 0x0x
  39.     move.l    \5,\4    ; \4 = 0x0x
  40.     and.l    \1,\3    ; \3 = 0b0r
  41.     and.l    \2,\4    ; \4 = 0j0z
  42.     eor.l    \3,\1    ; \1 = a0q0
  43.     eor.l    \4,\2    ; \2 = i0y0
  44.     add.l    \3,\3
  45.     lsr.l    #\6,\2    ; \2 = 0i0y
  46.     or.l    \2,\1        ; \1 = aiqy
  47.     or.l    \4,\3        ; \2 = bjrz
  48.     endm
  49.  
  50. merge2    macro    ;    i1    i2    t3    t4    m    s
  51.         ;    \1    \2    \3    \4    \5    \6
  52.         ;    output as \1,\3
  53.             ; \1 = abqr
  54.             ; \2 = ijyz
  55.     move.l    \5,\3    ; \3 = 0x0x
  56.     move.l    \5,\4    ; \4 = 0x0x
  57.     and.l    \1,\3    ; \3 = 0b0r
  58.     and.l    \2,\4    ; \4 = 0j0z
  59.     eor.l    \3,\1    ; \1 = a0q0
  60.     eor.l    \4,\2    ; \2 = i0y0
  61.     lsl.l    #\6,\3    ; \3 = b0r0
  62.     lsr.l    #\6,\2    ; \2 = 0i0y
  63.     or.l    \2,\1        ; \1 = aiqy
  64.     or.l    \4,\3        ; \2 = bjrz
  65.     endm
  66.         
  67. _Chunky2Planar:
  68.         ;a0 = chunky buffer
  69.         ;a1 = first bitplane
  70.         ;d0    = width
  71.  
  72.     movem.l    d2-d7/a2-a6,-(sp)
  73.     move.l    a0,a2
  74.     move.l    d0,plsiz
  75.     add.l    d0,a2    ;a2 = end of chunky buffer
  76.     asr.l    #3,d0
  77.     move.l    d0,lineoff
  78.     
  79.     ;; Sweep thru the whole chunky data once,
  80.     ;; Performing 3 merge operations on it.
  81.     
  82.     move.l    #$00ff00ff,a3    ; load byte merge mask
  83.     move.l    #$0f0f0f0f,a4    ; load nibble merge mask
  84.     
  85. firstsweep
  86.  
  87.     ; pass 1
  88.     movem.l    (a0),d0-d7    ;8+4n     40    cycles
  89.     ; d0-7 = abcd efgh ijkl mnop qrst uvwx yzAB CDEF
  90.     ;; 40c
  91.     
  92.     wordmerge    d0,d4,a6    ;d0/4 = abqr cdst
  93.     wordmerge    d1,d5,a6    ;d1/5 = efuv ghwx
  94.     wordmerge    d2,d6,a6    ;d2/6 = ijyz klAB
  95.     wordmerge    d3,d7,a6     ;d3/7 = mnCD opEF
  96.     ;; 4*14c
  97.  
  98.     ; save off a bit of shit
  99.     move.l    d7,a6
  100.     move.l    d6,a5
  101.     ;; 4c
  102.         
  103.     ; pass 2
  104.     merge2    d0,d2,d6,d7,a3,8    ;d0/d6 = aiqy bjrz
  105.     merge2    d1,d3,d7,d2,a3,8    ;d1/d7 = emuc fnvD
  106.     ;; 2*24
  107.     
  108.     ; pass 3
  109.     merge2    d0,d1,d2,d3,a4,4    ;d0/d2  = ae74... ae30...
  110.     merge2    d6,d7,d3,d1,a4,4    ;d6/d3  = bf74... bf30...
  111.     ;; 2*24
  112.     
  113.     move.l    d0,(a0)+
  114.     move.l    d2,(a0)+
  115.     move.l    d6,(a0)+
  116.     move.l    d3,(a0)+
  117.     ;; 4*4c
  118.     
  119.     ; bring it back
  120.     move.l    a6,d7
  121.     move.l    a5,d6
  122.     ;; 2*2c
  123.         
  124.     ; pass 2
  125.     merge2    d4,d6,d0,d1,a3,8    ;d4/d0 = cksA dltB
  126.     merge2    d5,d7,d1,d6,a3,8    ;d5/d1 = gowE hpxF
  127.     ;; 2*24c
  128.     
  129.     ; pass 3            
  130.     merge2    d4,d5,d6,d7,a4,4    ;d4/d6 = cg74.. cg30..
  131.     merge2    d0,d1,d7,d5,a4,4    ;d0/d7 = dh74.. dh30..
  132.     ;; 2*24c
  133.         
  134.     move.l    d4,(a0)+
  135.     move.l    d6,(a0)+
  136.     move.l    d0,(a0)+
  137.     move.l    d7,(a0)+
  138.     ;; 4*4c
  139.     
  140.     cmp.l    a0,a2        ;; 4c
  141.     bne.w    firstsweep    ;; 6c
  142.  
  143.     ;; 338
  144.     
  145.     ; (a0)     ae74.. ae30.. bf74.. bf30.. cg74.. cg30.. dh74.. dh30..
  146.  
  147. ;    bra.w    exit
  148.     
  149.     sub.l    plsiz,a0
  150.     move.l    #$33333333,a5
  151.     move.l    #$55555555,a6
  152.  
  153.  
  154.     move.l    plsiz,d0
  155.     asr.l    #1,d0
  156.     add.l    d0,a1    ;a1 = plane4
  157.     
  158. secondsweep
  159.  
  160.     move.l    (a0),d0
  161.     move.l    8(a0),d1
  162.     move.l    16(a0),d2
  163.     move.l    24(a0),d3
  164.     ;; 6+3*7
  165.     
  166.     ;; pass 4    
  167.     merge2    d0,d2,d6,d7,a5,2    ;d0/d6 = aceg76.. aceg54..
  168.     merge2    d1,d3,d7,d2,a5,2    ;d1/d7 = bdhf76.. bdhf54..
  169.     ;; 24*2c
  170.     
  171.     ;; pass 5    
  172.     merge1    d0,d1,d2,d3,a6,1    ;d0/d2 = abcd7... abcd6...
  173.     merge1    d6,d7,d3,d1,a6,1    ;d6/d3 = abcd5... abcd4...
  174.     ;; 24*2c
  175.  
  176.     move.l    a1,-(a7)
  177.     move.l    d3,(a1)
  178.     add.l    lineoff,a1
  179.     move.l    d6,(a1)
  180.     add.l    lineoff,a1
  181.     move.l    d2,(a1)
  182.     add.l    lineoff,a1
  183.     move.l    d0,(a1)
  184.     move.l     (a7)+,a1
  185.     add.l    #4,a1
  186.     ;;3*5+4c
  187.         
  188.     move.l    4(a0),d0
  189.     move.l    12(a0),d1
  190.     move.l    20(a0),d2
  191.     move.l    28(a0),d3
  192.     ;;4*7c
  193.     ;; pass 4    
  194.     merge2    d0,d2,d6,d7,a5,2    ;d0/d6 = aceg32.. aceg10..
  195.     merge2    d1,d3,d7,d2,a5,2    ;d1/d7 = bdhf32.. bdhf10..
  196.     ;;2*24
  197.     ;; pass 5    
  198.     merge1    d0,d1,d2,d3,a6,1    ;d0/d2 = abcd3... abcd2...
  199.     merge1    d6,d7,d3,d1,a6,1    ;d6/d3 = abcd1... abcd0...
  200.     ;;2*24
  201.     
  202.     move.l    a1,-(a7)
  203.     sub.l    lineoff,a1
  204.     move.l    d0,-4(a1)
  205.     sub.l    lineoff,a1
  206.     move.l    d2,-4(a1)
  207.     sub.l    lineoff,a1
  208.     move.l    d6,-4(a1)
  209.     sub.l    lineoff,a1
  210.     move.l    d3,-4(a1)
  211.     move.l  (a7)+,a1
  212.     ;;4*5
  213.     
  214.     add.l    #32,a0    ;;4c
  215.     cmp.l    a0,a2    ;;4c
  216.     bne.w    secondsweep    ;;6c
  217.  
  218.     ;300
  219.     
  220. exit    
  221.     movem.l    (sp)+,d2-d7/a2-a6
  222.     rts
  223.     
  224. plsiz        dc.l 0
  225. lineoff        dc.l 0
  226.